package com.sunriz.motordrive.utils;

/**
 * ClassName: baseConversionUtils
 * Package: com.sunriz.motordrive.utils
 * Description:
 *
 * @Author BuTang
 * @Create 2024/5/23 15:14
 * @Version 1.0
 */
public class BaseConversionUtils {

    /**
     * 将十进制数转换为两个byte
     * @param number 十进制值
     * @return 两个byte
     */
    public static byte[] intToBytes(int number){
        // 获取低8位
        byte bByte = (byte) (number & 0xFF);
        // 右移8位后获取高8位
        byte aByte = (byte) ((number >> 8) & 0xFF);
        return new byte[]{aByte,bByte};
    }


    /**
     * 将两个byte转换为十进制数
     * @param bytes 两个byte
     * @return 十进制值
     */
    public static int bytesToInt(byte[] bytes){
        int aByte =((int) bytes[0] & 0xFF) * 256;
        int bByte =(int) bytes[1] & 0xFF ;
        return (bByte +aByte) ;
    }

    /**
     * 将两个byte转换为十进制数
     * @param byte1,byte2 两个byte
     * @return 十进制值
     */
    public static int twoByteToInt(byte byte1,byte byte2){
        int aByte =((int)byte1 & 0xFF) * 256;
        int bByte =(int)byte2 & 0xFF ;
        return (bByte +aByte) ;
    }
    /**
     * 将十进制数转换为两个byte
     * @param value 十进制值
     * @return byte[]数组
     */
    public static byte[] intToTwoBytes(int value) {
        // 创建一个字节数组，长度为2，用于存储两个字节
        byte[] bytes = new byte[2];

        // 将整数的高8位（即值右移16位后的结果）转换为字节，并存储在第一个字节中
        bytes[0] = (byte) ((value >> 8) & 0xFF);

        // 将整数的低8位转换为字节，并存储在第二个字节中
        bytes[1] = (byte) (value & 0xFF);

        return bytes;
    }

    /**
     * 将十进制数转换为4个byte
     * @param value 十进制值
     * @return byte[]数组
     */
    public static byte[] intToFourBytes(int value) {
        // 创建一个字节数组，长度为4，用于存储四个字节
        byte[] bytes = new byte[4];

        // 将整数的高24位、高16位、高8位和低8位分别转换为字节
        // 高24位
        bytes[0] = (byte) ((value >> 24) & 0xFF);
        // 高16位
        bytes[1] = (byte) ((value >> 16) & 0xFF);
        // 高8位
        bytes[2] = (byte) ((value >> 8) & 0xFF);
        // 低8位
        bytes[3] = (byte) (value & 0xFF);
        return bytes;
    }

    public static int fourBytesToInt(byte[] bytes) {
        if (bytes == null || bytes.length != 4) {
            throw new IllegalArgumentException("Input byte array must have a length of 4.");
        }

        // 低8位
        int value = (bytes[3] & 0xFF);
        // 高8位
        value |= ((bytes[2] & 0xFF) << 8);
        // 高16位
        value |= ((bytes[1] & 0xFF) << 16);
        // 高24位
        value |= ((bytes[0] & 0xFF) << 24);

        return value;
    }

    /**
     * 将十进制值转换为十六位二进制格式
     * @param num 十进制
     * @return 十六位二进制
     */
    public static String intToBinary16(int num){
        String binaryString = Integer.toBinaryString(num);

        // 计算需要多少个前导零
        int leadingZeros = 16 - binaryString.length();

        // 构建带有前导零的二进制字符串
        StringBuilder binaryStringBuilder = new StringBuilder();
        for (int i = 0; i < leadingZeros; i++) {
            binaryStringBuilder.append('0');
        }
        binaryStringBuilder.append(binaryString);
        String s = binaryStringBuilder.toString();

        String returnString = s.substring(0,4) + " "+ s.substring(4,8) + " "+s.substring(8,12) + " "+s.substring(12,16) ;

        return returnString;
    }


}
